package org.example.campusforum.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.example.campusforum.dto.ArticleGetResponseDataRecord;
import org.example.campusforum.entity.Article;

import java.util.ArrayList;
import java.util.List;

/**
 * 文章查询数据访问层接口
 *
 * 提供多种条件的文章查询功能，支持按标题、分类等条件查询文章，
 * 并支持多种排序方式。使用动态SQL实现灵活的查询条件。
 *
 * @author CampusForum Team
 * @version 1.0
 * @since 2024
 */
@Mapper
public interface ArticleGetMapper extends BaseMapper<Article> {

    /**
     * 根据标题模糊查询文章
     *
     * 使用LEFT JOIN联表查询文章和用户信息，支持按标题进行模糊搜索。
     * 支持多种排序方式：点赞数、浏览数、评论数降序排列。
     * 只查询未删除的文章。
     *
     * @param title 文章标题关键词，支持模糊匹配
     * @param sort 排序类型：2-按点赞数降序，3-按浏览数降序，4-按评论数降序
     * @return 文章查询结果列表，包含文章信息和作者信息
     */
    @Select("<script>" +
            "SELECT a.id as articleId,a.title,a.content,a.like_count,a.comment_count,a.view_count, u.nickname, u.avatar " +
            "FROM article a LEFT JOIN user u ON a.user_id = u.id " +
            "WHERE a.title LIKE CONCAT('%', #{title}, '%') " +
            "AND a.is_deleted=0"+
            "<if test='sort == 2'>ORDER BY a.like_count DESC</if>" +
            "<if test='sort == 3'>ORDER BY a.view_count DESC</if>" +
            "<if test='sort == 4'>ORDER BY a.comment_count DESC</if>" +
            "</script>")
    ArrayList<ArticleGetResponseDataRecord> selectArticles(
            @Param("title") String title,
            @Param("sort") Long sort);

    /**
     * 根据分类ID查询文章
     *
     * 使用LEFT JOIN联表查询指定分类下的文章和用户信息。
     * 支持多种排序方式：点赞数、浏览数、评论数降序排列。
     * 只查询未删除的文章。
     *
     * @param categoryId 文章分类ID
     * @param sort 排序类型：2-按点赞数降序，3-按浏览数降序，4-按评论数降序
     * @return 文章查询结果列表，包含文章信息和作者信息
     */
    @Select("<script>" +
            "SELECT a.id as articleId,a.title,a.content,a.like_count,a.comment_count,a.view_count, u.nickname, u.avatar " +
            "FROM article a LEFT JOIN user u ON a.user_id = u.id " +
            "WHERE a.category_id = #{categoryId} " +
            "AND a.is_deleted=0"+
            "<if test='sort == 2'>ORDER BY a.like_count DESC</if>" +
            "<if test='sort == 3'>ORDER BY a.view_count DESC</if>" +
            "<if test='sort == 4'>ORDER BY a.comment_count DESC</if>" +
            "</script>")
    ArrayList<ArticleGetResponseDataRecord> selectArticlesByCategoryId(
            @Param("categoryId") Long categoryId,
            @Param("sort") Long sort);

    /**
     * 根据标题和分类ID查询文章
     *
     * 使用LEFT JOIN联表查询指定分类下符合标题关键词的文章和用户信息。
     * 同时支持分类筛选和标题模糊搜索，以及多种排序方式。
     * 只查询未删除的文章。
     *
     * @param title 文章标题关键词，支持模糊匹配
     * @param categoryId 文章分类ID
     * @param sort 排序类型：2-按点赞数降序，3-按浏览数降序，4-按评论数降序
     * @return 文章查询结果列表，包含文章信息和作者信息
     */
    @Select("<script>" +
            "SELECT a.id as articleId,a.title,a.content,a.like_count,a.comment_count,a.view_count, u.nickname, u.avatar " +
            "FROM article a LEFT JOIN user u ON a.user_id = u.id " +
            "WHERE a.category_id = #{categoryId} and a.title LIKE CONCAT('%', #{title}, '%')" +
            "AND a.is_deleted=0"+
            "<if test='sort == 2'>ORDER BY a.like_count DESC</if>" +
            "<if test='sort == 3'>ORDER BY a.view_count DESC</if>" +
            "<if test='sort == 4'>ORDER BY a.comment_count DESC</if>" +
            "</script>")
    ArrayList<ArticleGetResponseDataRecord> selectArticlesByTitleAndCategoryId(
            @Param("title") String title,
            @Param("categoryId") Long categoryId,
            @Param("sort") Long sort);
}
